使用go语言将json文件导入mongodb中相对还是比较方便的。

  首先 我用的是 mgo 这个 驱动。 其次因为文件是gz压缩 的。所以我们得先解压。使用 go自带的pkg compress/gzip 就行。

fr, err := os.Open(fpath)
handleError(err)
defer fr.Close()

fmt.Println(fr.Name())

gr, err := gzip.NewReader(fr)
handleError(err)

  正常来说,这里直接 调用 gr.Read()就可以了。。但是由于我的文件比较大,而且 ioutil.ReadAll() 也不行 ,所以这里我使用了循环读入

// 因为 gr一次读入 读满的话是3800 - 4000个字符,
// 所以BUFSIZE = 4000
buf := make([]byte, BUFSIZE)
var data []byte
var num int = 0
for {
    n, err := gr.Read(buf)
    data = append(data, buf[:n]...)
    if err == io.EOF {
        break
    }
    num += n
    handleError(err)
}

   如果只有 一个 类似{"id":12434,"name":foo} 这样的数据话 直接

var inter interface{}
err = json.Unmarshal([]byte(s), &inter)
handleError(err)
c := session.DB("test").C("user")
err = c.Insert(inter)

  注意不能直接将数据写入DB,没有经过解码的话,存进去的将是ASCII码值

  但是 如果是

{"id":12434,"name":"foo"}
{"id":12435,"name":"foo1"}
{"id":12436,"name":"foo2"}  

  使用 json.Unmarshal() 会发生错误,对于这种情况,我暂时还没想到其他办法,所以就使用了正则表达式,将其分割成[]string,然后再处理

reg, err := regexp.Compile(`[{].*[}][\n]`)
handleError(err)

sdata := reg.FindAllString(string(data), -1)
fmt.Println(len(sdata))

for _, s := range sdata {
    var inter interface{}

    err = json.Unmarshal([]byte(s), &inter)
    handleError(err)
    c := session.DB("testGoBig").C("Event")
    err = c.Insert(inter)

}

  这样就成功的将json文件导入了mongodb中。因为测试的数据比较大,(大约 2G) 所以 串行的话 大约要1个半小时,所以我又用了goruntine,下次说说其中遇到的坑和经验。



blog comments powered by Disqus

Published

2013-10-20

Categories


Tags